#include <stdio.h>
#include <stdlib.h>
#include <linux/i2c-dev.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdint.h>
#include <math.h>
#include "get_mq135.h"

#define I2C_ADDR 0x48
#define CONV_REG 0x00
#define CONF_REG 0x01
#define CONFIG_HIGH 0xC3
#define CONFIG_LOW  0x83
#define i2c_bus "/dev/i2c-1"

// 读取空气质量浓度值
// 返回: 浓度值（ppm），出错时返回-1.0
int get_air_quality(float *concentration) {
	int file;
	uint8_t buffer[3];
	int16_t value;
	float voltage;

	// 打开I2C总线
	if ((file = open(i2c_bus, O_RDWR)) < 0) {
		perror("Failed to open I2C bus");
		return -1.0f;
	}

	// 设置I2C从设备地址
	if (ioctl(file, I2C_SLAVE, I2C_ADDR) < 0) {
		perror("Failed to set I2C address");
		close(file);
		return -1.0f;
	}

	// 配置ADS1115
	buffer[0] = CONF_REG;
	buffer[1] = CONFIG_HIGH;
	buffer[2] = CONFIG_LOW;
	if (write(file, buffer, 3) != 3) {
		perror("Failed to configure ADS1115");
		close(file);
		return -1.0f;
	}

	// 等待转换完成（根据128SPS速率）
	usleep(9000);  // 9ms等待

	// 设置读取转换寄存器
	buffer[0] = CONV_REG;
	if (write(file, buffer, 1) != 1) {
		perror("Failed to set register pointer");
		close(file);
		return -1.0f;
	}

	// 读取转换结果
	if (read(file, buffer, 2) != 2) {
		perror("Failed to read conversion data");
		close(file);
		return -1.0f;
	}

	close(file);

	// 组合两个字节（MSB first）
	value = (buffer[0] << 8) | buffer[1];

	// 计算电压值（FSR = ±4.096V）
	voltage = (value * 4.096f) / 32767.0f;

	// 转换为浓度（示例校准公式，需根据实际传感器调整）
	*concentration = expf(voltage * 0.5f - 2.0f);
	dbg_printf("air concentration:%.2f ppm\n", *concentration);
	return 0;
}
